﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using blacksoft.Models;
using System.Data.Entity.Core.Objects;
using blacksoft.Constantes;

namespace blacksoft.Controllers
{
    public class PromocionController : Controller
    {
        private inf245travelbusEntities db = new inf245travelbusEntities();

        private class TiposCliente
        {
            public int valor { get; set; }
            public string nombre { get; set; }
            public TiposCliente(int valor, string nombre)
            {
                this.valor = valor;
                this.nombre = nombre;
            }
        }
        private List<TiposCliente> tipos_cliente = new List<TiposCliente> { new TiposCliente(3, "Cliente Regular"), new TiposCliente(4, "Cliente Frecuente") };

        // GET: /Promocion/
        public ActionResult Index(string search_porcdesc, string search_puntreq, string search_finicio, string search_ffin)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.VENTA))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }

            bool global = PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL);
            //Seleccionar todas las promociones
            var promociones = from p in db.Promocion
                              where p.Estado != "AN"
                              select p;
            //Local session
            int idTerminal;
            if (!global)
            {
                idTerminal = (int)Session["IDTerminal"];
                promociones = promociones.Where(s => s.IDTerminal == idTerminal);
            } 

            //Filtrar las promociones
            if (!String.IsNullOrEmpty(search_porcdesc))
            {
                try
                {
                    double dobl_porcdesc = double.Parse(search_porcdesc);
                    promociones = promociones.Where(s => s.PorcentajeDescuento == dobl_porcdesc);
                }
                catch
                {
                    promociones = promociones.Where(s => s.Estado == "AC");
                    return View(promociones);
                }
            }

            if (!string.IsNullOrEmpty(search_puntreq))
            {
                try
                {
                    int aux_puntreq = int.Parse(search_puntreq);
                    promociones = promociones.Where(s => s.PuntosRequeridos == aux_puntreq);
                }
                catch
                {
                    promociones = promociones.Where(s => s.Estado == "AC");
                    return View(promociones);
                }
            }

            if (!string.IsNullOrEmpty(search_finicio))
            {
                try
                {
                    DateTime aux_date = Convert.ToDateTime(search_finicio);
                    promociones = promociones.Where(s => EntityFunctions.TruncateTime(s.FechaInicio) == EntityFunctions.TruncateTime(aux_date));
                }
                catch
                {
                    promociones = promociones.Where(s => s.Estado == "AC");
                    return View(promociones);
                }
            }

            if (!string.IsNullOrEmpty(search_ffin))
            {
                try
                {
                    DateTime aux_date = Convert.ToDateTime(search_ffin);
                    promociones = promociones.Where(s => EntityFunctions.TruncateTime(s.FechaFin) == EntityFunctions.TruncateTime(aux_date));
                }
                catch
                {
                    promociones = promociones.Where(s => s.Estado == "AC");
                    return View(promociones);
                }
            }

            promociones = promociones.Where(s => s.Estado == "AC");
 
            return View(promociones);
        }

        // GET: /Promocion/Details/5
        public ActionResult Details(int? id)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.VENTA))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            if (id == null)
            {
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                return RedirectToAction("Index");
            }
            Promocion promocion = db.Promocion.Find(id);
            if (promocion == null)
            {
                return HttpNotFound(); //no esta controlado :S
            }
            return View(promocion);
        }

        // GET: /Promocion/Create
        public ActionResult Create()
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.VENTA))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            ViewBag.TipoCliente = new SelectList(tipos_cliente, "valor", "nombre");
            return View();
        }

        // POST: /Promocion/Create
        // Para protegerse de ataques de publicación excesiva, habilite las propiedades específicas a las que desea enlazarse. Para obtener 
        // más información vea http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "IdPromocion,TipoCliente,PorcentajeDescuento,PuntosRequeridos,FechaInicio,FechaFin,Descripcion")] Promocion promocion)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.VENTA))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            SelectList tipos = new SelectList(tipos_cliente, "valor", "nombre");
            if (promocion.FechaInicio >= promocion.FechaFin)
            {
                ModelState.AddModelError("ErrorFIMayorFE", "La Fecha de Inicio deber ser menor a la Fecha de Fin");
                ViewBag.TipoCliente = tipos;
                return View(promocion);
            }
            if (ModelState.IsValid)
            {
                promocion.Estado = "AC";
                promocion.IDTerminal = (int)Session["IDTerminal"];
                db.Promocion.Add(promocion);
                try
                {
                    db.SaveChanges();
                }
                catch
                {
                    TempData["create_failure"] = "La promoción no se pudo registrar";
                    return RedirectToAction("Index");
                }
                TempData["create_success"] = "La promoción se registró exitosamente";
                return RedirectToAction("Index");
            }

            ViewBag.TipoCliente = tipos;

            return View(promocion);
        }

        // GET: /Promocion/Edit/5
        public ActionResult Edit(int? id)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.VENTA))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            try
            {
                Promocion promocion = db.Promocion.Find(id);
                if (promocion == null)
                {
                    return HttpNotFound();
                }
                SelectList tipos = new SelectList(tipos_cliente,"valor","nombre",promocion.TipoCliente);
                ViewBag.TipoCliente = tipos;
                return View(promocion);
            }
            catch
            {
                TempData["edit_failure"] = "No se encontró la promoción";
                return RedirectToAction("Index");
            }
        }

        // POST: /Promocion/Edit/5
        // Para protegerse de ataques de publicación excesiva, habilite las propiedades específicas a las que desea enlazarse. Para obtener 
        // más información vea http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "IdPromocion,TipoCliente,PorcentajeDescuento,PuntosRequeridos,FechaInicio,FechaFin,Estado,Descripcion")] Promocion promocion)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.VENTA))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            if (ModelState.IsValid)
            {
                db.Entry(promocion).State = EntityState.Modified;
                try
                {
                    db.SaveChanges();
                }
                catch
                {
                    TempData["edit_failure"] = "La promoción no se pudo modificar";
                    return RedirectToAction("Index");
                }
                TempData["edit_success"] = "La promociónse modificó exitosamente";
                return RedirectToAction("Index");
            }
            SelectList tipos = new SelectList(tipos_cliente, "valor", "nombre");
            ViewBag.TipoCliente = tipos;
            return View(promocion);
        }

        // GET: /Promocion/Delete/5
        public ActionResult Delete(int? id)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.VENTA))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            try
            {
                Promocion promocion = db.Promocion.Find(id);
                if (promocion == null)
                {
                    return HttpNotFound();
                }
                return View(promocion);
            }
            catch
            {
                TempData["delete_failure"] = "No se encontró la promoción";
                return RedirectToAction("Index");
            }
        }

        // POST: /Promocion/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.VENTA))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            Promocion promocion = db.Promocion.Find(id);
            promocion.Estado = "AN";
            db.Entry(promocion).State = EntityState.Modified;
            try
            {
                db.SaveChanges();
            }
            catch
            {
                TempData["delete_failure"] = "La promoción no se pudo eliminar";
                return RedirectToAction("Index");
            }
            TempData["delete_success"] = "La promoción se eliminó exitosamente";
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
